#!/bin/sh
#
# culldeps
#
# Filter redundant dependencies.
#
# Each line of input and output contains two syspkg names,
# where the first syspkg depends on the second syspkg.
#
# Emit all the dependencies on the standard input to the standard
# output EXCEPT the dependencies which can be derived from other
# dependencies by the transitive rule. For example, omit both A C
# and A D from
#
# 	A B
# 	B C
# 	C D
# 	A C
# 	A D
#
# because A C can be derived from A B and B C by transitivity,
# and A D can be derived from A B, B C, C D by transitivity.
#

prog="${0##*/}"
rundir="$(dirname "$0")" # ${0%/*} isn't good enough when there's no "/"
. "${rundir}/sets.subr"

SCRATCH="$(${MKTEMP} -d "/var/tmp/${prog}.XXXXXX")"
NEXTLEFTOVERS="${SCRATCH}/leftovers0"
LASTJOIN="${SCRATCH}/join0"
NEXTJOIN="${SCRATCH}/join1"
TAB="	"

${SORT} -k 1 > "${LASTJOIN}"

LEFTOVERS="${LASTJOIN}"

while [ "$(${WC} -l "${LASTJOIN}" | ${AWK} '{ print $1; }')" -ne 0 ]; do

	#
	# From dependencies X-requires-Y in ${LEFTOVERS} and Y-requires-Z in
	# ${LASTJOIN}, produce dependencies X-requires-Z and write them to
	# ${NEXTJOIN}.
	#
	${SORT} -k 2 < "${LEFTOVERS}" | \
	    ${JOIN} -1 2 -2 1 -o '1.1 2.2' - "${LASTJOIN}" | \
	    ${SORT} -u > "${NEXTJOIN}"
	if [ ${DEBUG:-0} -gt 0 ]; then
		echo >&2 "${prog}: ### begin filtered results ###"
		${JOIN} -t "${TAB}" "${NEXTJOIN}" "${LEFTOVERS}" | ${SORT} 1>&2
		echo >&2 "${prog}: ### end filtered results ###"
	fi

	#
	# Filter out of ${LEFTOVERS} all of the dependencies X-requires-Z, which
	# were produced in the previous step. Write the new leftovers to
	# ${NEXTLEFTOVERS}.
	#
	${JOIN} -v 2 -t "${TAB}" "${NEXTJOIN}" "${LEFTOVERS}" | \
		${SORT} -u > "${NEXTLEFTOVERS}"

	#
	# Swap output files before repeating. 
	#
	LASTJOIN="${NEXTJOIN}"
	if [ "$(basename "${NEXTJOIN}")" = join0 ]; then
		NEXTJOIN="${SCRATCH}/join1"
	else
		NEXTJOIN="${SCRATCH}/join0"
	fi
	LEFTOVERS="${NEXTLEFTOVERS}"
	if [ "$(basename "${NEXTLEFTOVERS}")" = leftovers0 ]; then
		NEXTLEFTOVERS="${SCRATCH}/leftovers1"
	else
		NEXTLEFTOVERS="${SCRATCH}/leftovers0"
	fi
done

#
# Output all of the dependencies that were not culled and clean up.
#
cat "${LEFTOVERS}"
rm -r "${SCRATCH}"
